/**
 * mysql，该包依赖 go-redis，封装了一层 redis 操作层，用于统一 redis 操作及日志打印
 * 创建者：Bryce
 * 创建时间：20210807
 */
package redis

import (
	"context"
	"fmt"
	"github.com/go-playground/validator/v10"
	db "github.com/go-redis/redis/v8"
)

// Redis 配置信息结构
type Config struct {
	Host    string `json:"host" validate:"required"`   // Redis链接地址
	Port    int    `json:"port" validate:"required"`   // Redis链接端口
	User    string `json:"user"`                       // Redis6.0 有可能使用
	Pwd     string `json:"password"`                   // Redis链接账号密码
	Db      int    `json:"db" validate:"min=0,max=15"` // 指定操作 redis 库
	Pool    int    `json:"pool"`                       // 设置链接池数量
	MinIdle int    `json:"min_idle"`                   // 最小允许空闲链接数
}

// 注入配置，构建 redis 操作客户端
func BuildClient(c *Config) (client *db.Client, err error) {
	// 1. 验证配置信息
	if err = validator.New().Struct(c); err != nil {
		return nil, err
	}
	// 2. 设置默认值
	if c.Pool == 0 {
		c.Pool = 100
	}
	if c.MinIdle == 0 {
		c.MinIdle = 10
	}
	// 2. 新建 redis 客户端
	client = db.NewClient(&db.Options{
		Addr:         fmt.Sprintf("%s:%d", c.Host, c.Port),
		Password:     c.Pwd,
		DB:           c.Db,
		MinIdleConns: c.MinIdle,
		PoolSize:     c.Pool,
		MaxRetries:   3, // 最大重试次数
	})
	// 3. 测试 redis 链接是否有效，PONG
	_, err = client.Ping(context.Background()).Result()
	return client, err
}
